package org.springframework.ai.mcp.samples.brave;

import java.util.List;

import io.modelcontextprotocol.client.McpSyncClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

	private static final Logger logger = LoggerFactory.getLogger(Application.class);

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args).close();
	}

	/**
	 * 一、谁触发了 MCP？
	 * 触发 MCP 的是你这句代码：
	 *
	 * chatClient.prompt(question).call()
	 * 调用过程简化为：
	 *
	 * chatClient.prompt(...) 创建了一个 Chat 请求。
	 *
	 * .call() 实际向模型发起请求，此时会触发内部的 callback、拦截器机制。
	 *
	 * 如果模型在响应中“想要调用工具”，就会通过你注册的 ToolCallbackProvider 来调度对应的工具。
	 *
	 * 二、什么时候判断需要用 MCP？
	 * 判断“是否需要用 MCP”是在模型响应中由模型自身决定的 —— 具体是在模型生成的 Tool Call / Function Call 阶段。
	 *
	 * 具体过程如下：
	 * 用户提问：
	 *
	 * Does Spring AI support the Model Context Protocol? Please provide some references.
	 * 模型（如 Ollama、OpenAI）经过推理后，如果认为这个问题需要调用工具（比如它知道“MCP 查询”是一个可以调用的工具），就会在响应中生成一个 Tool Call，比如：
	 *
	 * {
	 *   "tool_call": {
	 *     "name": "mcp.query",
	 *     "arguments": {
	 *       "topic": "Spring AI and MCP support"
	 *     }
	 *   }
	 * }
	 * Spring AI 的 ChatClient 检查到模型生成了 Tool Call，接着：
	 *
	 * 查找注册的 ToolCallbackProvider（你这用的是 SyncMcpToolCallbackProvider）
	 *
	 * 调用它提供的对应工具（比如 McpSyncClient）
	 *
	 * 拿到工具返回结果，再交给模型继续生成最终的回复。
	 * @param chatClientBuilder
	 * @param mcpSyncClients
	 * @return
	 */
	@Bean
	public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,
		List<McpSyncClient> mcpSyncClients) {

		return args -> {

			//wuxiaoxu test mcp方法是怎么触发的？
			var chatClient = chatClientBuilder
					.defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients))
					.build();

			String question = "Does Spring AI supports the Model Context Protocol? Please provide some references.";
			logger.info("QUESTION: {}\n", question);
			logger.info("ASSISTANT: {}\n", chatClient.prompt(question).call().content());
			System.out.println();
			System.out.println();
		};
	}
}